package com.smooth.mall.service.serviceImpl;

import com.smooth.mall.common.Constant;
import com.smooth.mall.exception.SmoothMallException;
import com.smooth.mall.exception.SmoothMallExceptionEnum;
import com.smooth.mall.model.dao.CartMapper;
import com.smooth.mall.model.dao.ProductMapper;
import com.smooth.mall.model.pojo.Cart;
import com.smooth.mall.model.pojo.Product;
import com.smooth.mall.service.CartService;
import com.smooth.mall.model.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private CartMapper cartMapper;
    //每次添加完购物车后，购物车里的内容是变化的，因此需要返回一个List集合
    //采用直接返回List集合，可以减少前端刷新次数，提高查询效率
    @Override
    public List<CartVO> add(Integer userId, Integer productId, Integer count){
        //1、验证此次新增商品到购物车是否合法
        validProduct(productId,count);
        //2、判断商品是否在购物车中
        Cart cart = cartMapper.selectByUserIdAndProductId(userId, productId);
        if(cart==null){
            //商品不在购物车中，新增购物车记录
            cart=new Cart();
            cart.setProductId(productId);
            cart.setUserId(userId);
            cart.setQuantity(count);
            //在Constant中，设置被选中状态接口，便于代码修改及查阅，使得代码更加规范，功能扩展方便
            cart.setSelected(Constant.Cart.CHECKED);
            cartMapper.insertSelective(cart);
        }else{
            //修改购物车数据,商品已经在购物车中，则数量相加
            count=cart.getQuantity()+count;
            Cart cartNew = new Cart();
            cartNew.setId(cart.getId());
            cartNew.setProductId(productId);
            cartNew.setUserId(userId);
            cartNew.setQuantity(count);
            //只要用户添加到购物车中，就默认为商品是选中状态
            cartNew.setSelected(Constant.Cart.CHECKED);
            cartMapper.updateByPrimaryKeySelective(cartNew);
        }
        //返回购物车列表
        return this.list(userId);
    }
    /**
     * Integer productId：商品Id
     * Integer count：新增商品数量
     *
     * */
    private void validProduct(Integer productId,Integer count){
        Product product = productMapper.selectByPrimaryKey(productId);
        //1、判断商品是否存在，商品是否上架
        //在Constant中，设置上下架状态接口，便于代码修改及查阅，使得代码更加规范，功能扩展方便
        //if(product==null||!product.getStatus().equals(1)){
        if(product==null||product.getStatus().equals(Constant.SaleStatus.NOT_SALE)){
            //设置异常枚举NOT_SALE(商品状态不可售)
            throw new SmoothMallException(SmoothMallExceptionEnum.NOT_SALE);
        }
        //2、判断商品库存
        if(count>product.getStock()){
            //设置异常枚举NOT_ENOUGH(商品库存不足)
            System.out.println("引发报错的count = " + count);
            throw new SmoothMallException(SmoothMallExceptionEnum.NOT_ENOUGH);
        }
    }
    @Override
    public List<CartVO> list(Integer userId){
        List<CartVO> cartVOS = cartMapper.selectList(userId);
        //设置totalPrice值
        for (int i = 0; i < cartVOS.size(); i++) {
            CartVO cartVO = cartVOS.get(i);
            cartVO.setTotalPrice(cartVO.getPrice()*cartVO.getPrice());
        }
        return cartVOS;
    }
    @Override
    public List<CartVO> update(Integer userId, Integer productId, Integer count) {
        validProduct(productId, count);
        Cart cart = cartMapper.selectCartByUserIdAndProductId(userId, productId);
        if (cart == null) {
//这个商品之前不在购物车里，无法更新
            throw new SmoothMallException(SmoothMallExceptionEnum.UPDATE_FAILED);
        } else {
//这个商品已经在购物车里了，则更新数量
            Cart cartNew = new Cart();
            cartNew.setQuantity(count);
            cartNew.setId(cart.getId());
            cartNew.setProductId(cart.getProductId());
            cartNew.setUserId(cart.getUserId());
            cartNew.setSelected(Constant.Cart.CHECKED);
            cartMapper.updateByPrimaryKeySelective(cartNew);
        }
        return this.list(userId);
    }
    @Override
    public List<CartVO> delete(Integer userId, Integer productId) {
        Cart cart = cartMapper.selectCartByUserIdAndProductId(userId, productId);
        if (cart == null) {
            //这个商品之前不在购物车里，无法删除
            throw new SmoothMallException(SmoothMallExceptionEnum.DELETE_FAILED);
        } else {
            //这个商品已经在购物车里了，则可以删除
            cartMapper.deleteByPrimaryKey(cart.getId());
        }
        return this.list(userId);
    }

    @Override
    public List<CartVO> selectOrNot(Integer userId, Integer productId, Integer selected) {
        Cart cart = cartMapper.selectCartByUserIdAndProductId(userId, productId);
        if (cart == null) {
            //这个商品之前不在购物车里，无法选择/不选中
            throw new SmoothMallException(SmoothMallExceptionEnum.UPDATE_FAILED);
        } else {
            //这个商品已经在购物车里了，则可以选中/不选中
            cartMapper.selectOrNot(userId,productId,selected);
        }
        return this.list(userId);
    }

    @Override
    public List<CartVO> selectAllOrNot(Integer userId, Integer selected) {
//改变选中状态
        cartMapper.selectOrNot(userId, null, selected);
        return this.list(userId);
    }

}

